Handle the raw payloads in requests and responses to convert-endpoint. This change replaces Base64-encoded I/O with direct binary streaming, yielding several benefits: - **Network efficiency**: Eliminates the ~33% size inflation of Base64, cutting bandwidth and latency. - **Memory savings**: Enables piping DOCX (already compressed) buffers straight to DocSpec API without holding, encoding and decoding multi-MB payload in RAM. Signed-off-by: Stephan Meijer <me@stephanmeijer.com>
54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
"""Converter services."""
|
|
|
|
from base64 import b64encode
|
|
|
|
from django.conf import settings
|
|
|
|
import requests
|
|
|
|
|
|
class ConversionError(Exception):
|
|
"""Base exception for conversion-related errors."""
|
|
|
|
|
|
class ValidationError(ConversionError):
|
|
"""Raised when the input validation fails."""
|
|
|
|
|
|
class ServiceUnavailableError(ConversionError):
|
|
"""Raised when the conversion service is unavailable."""
|
|
|
|
|
|
class YdocConverter:
|
|
"""Service class for conversion-related operations."""
|
|
|
|
@property
|
|
def auth_header(self):
|
|
"""Build microservice authentication header."""
|
|
# Note: Yprovider microservice accepts only raw token, which is not recommended
|
|
return settings.Y_PROVIDER_API_KEY
|
|
|
|
def convert(self, text):
|
|
"""Convert a Markdown text into our internal format using an external microservice."""
|
|
|
|
if not text:
|
|
raise ValidationError("Input text cannot be empty")
|
|
|
|
try:
|
|
response = requests.post(
|
|
f"{settings.Y_PROVIDER_API_BASE_URL}{settings.CONVERSION_API_ENDPOINT}/",
|
|
data=text,
|
|
headers={
|
|
"Authorization": self.auth_header,
|
|
"Content-Type": "text/markdown",
|
|
},
|
|
timeout=settings.CONVERSION_API_TIMEOUT,
|
|
verify=settings.CONVERSION_API_SECURE,
|
|
)
|
|
response.raise_for_status()
|
|
return b64encode(response.content).decode("utf-8")
|
|
except requests.RequestException as err:
|
|
raise ServiceUnavailableError(
|
|
"Failed to connect to conversion service",
|
|
) from err
|