feat: add server-side request context#201
Conversation
posthog-go Compliance ReportDate: 2026-05-22 21:27:16 UTC
|
| Test | Status | Duration |
|---|---|---|
| Format Validation.Event Has Required Fields | ✅ | 614ms |
| Format Validation.Event Has Uuid | ✅ | 607ms |
| Format Validation.Event Has Lib Properties | ✅ | 608ms |
| Format Validation.Distinct Id Is String | ✅ | 608ms |
| Format Validation.Token Is Present | ✅ | 608ms |
| Format Validation.Custom Properties Preserved | ✅ | 607ms |
| Format Validation.Event Has Timestamp | ✅ | 608ms |
| Retry Behavior.Retries On 503 | ✅ | 5613ms |
| Retry Behavior.Does Not Retry On 400 | ✅ | 2609ms |
| Retry Behavior.Does Not Retry On 401 | ✅ | 2610ms |
| Retry Behavior.Respects Retry After Header | ✅ | 5613ms |
| Retry Behavior.Implements Backoff | ✅ | 15614ms |
| Retry Behavior.Retries On 500 | ✅ | 5613ms |
| Retry Behavior.Retries On 502 | ✅ | 5613ms |
| Retry Behavior.Retries On 504 | ✅ | 5613ms |
| Retry Behavior.Max Retries Respected | ✅ | 15614ms |
| Deduplication.Generates Unique Uuids | ✅ | 616ms |
| Deduplication.Preserves Uuid On Retry | ✅ | 5613ms |
| Deduplication.Preserves Uuid And Timestamp On Retry | ✅ | 10619ms |
| Deduplication.Preserves Uuid And Timestamp On Batch Retry | ✅ | 5614ms |
| Deduplication.No Duplicate Events In Batch | ✅ | 612ms |
| Deduplication.Different Events Have Different Uuids | ✅ | 610ms |
| Compression.Sends Gzip When Enabled | ✅ | 607ms |
| Batch Format.Uses Proper Batch Structure | ✅ | 608ms |
| Batch Format.Flush With No Events Sends Nothing | ✅ | 606ms |
| Batch Format.Multiple Events Batched Together | ✅ | 611ms |
| Error Handling.Does Not Retry On 403 | ✅ | 2610ms |
| Error Handling.Does Not Retry On 413 | ✅ | 2610ms |
| Error Handling.Retries On 408 | ✅ | 5612ms |
Feature_Flags Tests
View Details
| Test | Status | Duration |
|---|---|---|
| Request Payload.Request With Person Properties Device Id | ❌ | 8ms |
| Request Payload.Flags Request Uses V2 Query Param | ✅ | 6ms |
| Request Payload.Flags Request Hits Flags Path Not Decide | ✅ | 6ms |
| Request Payload.Flags Request Omits Authorization Header | ✅ | 6ms |
| Request Payload.Token In Flags Body Matches Init | ✅ | 6ms |
| Request Payload.Groups Round Trip | ✅ | 7ms |
| Request Payload.Groups Default To Empty Object | ✅ | 6ms |
| Request Payload.Person Properties Distinct Id Auto Populated When Caller Omits It | ❌ | 7ms |
| Request Payload.Disable Geoip False Propagates As Geoip Disable False | ❌ | 6ms |
| Request Payload.Disable Geoip Omitted Defaults To False | ❌ | 6ms |
| Request Payload.Flag Keys To Evaluate Contains Only Requested Key | ❌ | 6ms |
| Request Lifecycle.No Flags Request On Init Alone | ✅ | 4ms |
| Request Lifecycle.No Flags Request On Normal Capture | ✅ | 607ms |
| Request Lifecycle.Two Flag Calls Produce Two Remote Requests | ✅ | 10ms |
| Request Lifecycle.Mock Response Value Is Returned To Caller | ✅ | 5ms |
| Side Effect Events.Get Feature Flag Captures Feature Flag Called Event | ❌ | 609ms |
Failures
request_payload.request_with_person_properties_device_id
Field 'distinct_id' not found in /flags request body at path 'person_properties.distinct_id'. Available keys: ['$device_id']
request_payload.person_properties_distinct_id_auto_populated_when_caller_omits_it
Field 'distinct_id' not found in /flags request body at path 'person_properties.distinct_id'. Available keys: ['email']
request_payload.disable_geoip_false_propagates_as_geoip_disable_false
Expected geoip_disable=False, got True
request_payload.disable_geoip_omitted_defaults_to_false
Expected geoip_disable=False, got True
request_payload.flag_keys_to_evaluate_contains_only_requested_key
Field 'flag_keys_to_evaluate' not found in /flags request body at path 'flag_keys_to_evaluate'. Available keys: ['api_key', 'distinct_id', 'groups', 'person_properties', 'group_properties', 'geoip_disable']
side_effect_events.get_feature_flag_captures_feature_flag_called_event
Expected 1 events with name '$feature_flag_called', got 2
0ca790a to
f744a05
Compare
c9573cc to
bf6f924
Compare
|
summoning greptile |
|
| scheme := requestScheme(r) | ||
| host := requestHost(r) | ||
| if scheme == "" || host == "" { | ||
| return "" |
There was a problem hiding this comment.
for this all and other methods here better to return nil instead of empty if we cannot derive the prop
💡 Motivation and Context
Adds server-side request context support for Go
net/httpapps, matching the request-context patterns used in other PostHog server SDKs.This lets handlers enqueue capture and exception events with request-scoped metadata and optional frontend tracing headers, while keeping explicit event identity authoritative and falling back to personless events when no identity is available.
Key changes:
RequestContexthelpers,NewRequestContextMiddleware, andEnqueueWithContext.$current_url,$request_method,$request_path,$user_agent,$ip) and optional tracing header values.$process_person_profile: false.💚 How did you test it?
gofmt -l $(git diff --name-only -- '*.go') request_context.go request_context_test.gogo test ./...📝 Checklist
If releasing new changes
pnpm changesetto generate a changeset file